package br.ufrj.dcc.compconc.controlador;

import br.ufrj.dcc.compconc.modelo.Barco;
import br.ufrj.dcc.compconc.modelo.ProgramadorC;
import br.ufrj.dcc.compconc.modelo.ProgramadorJava;
import br.ufrj.dcc.compconc.vista.MainWindow;

/**
 * Classe responsavel pelo controle da aplicacao. Promove a interacao entre as classes da vista e do modelo
 * @author Joao Paulo de Freitas Ramirez e Joao Lucas Nery
 *
 */
public class Controlador {
	
	/**
	 * Variavel usada para fazer a implementacao de singleton para o controlador
	 */
	private static Controlador instanciaDeControlador;
	
	/**
	 * Construtor default apenas ajustado para ser private
	 */
	private Controlador(){}
	
	/**
	 * Metodo que implementa o padrao singleton. Gera uma instancia de <code>Controlador</code> apenas se ainda nao houver nenhuma instancia dessa classe
	 * @return retorna uma instancia de <code>Controlador</code>
	 * @see Controlador#instanciaDeControlador
	 */
	public static Controlador getInstance(){
		if(Controlador.instanciaDeControlador == null) instanciaDeControlador = new Controlador();
		return instanciaDeControlador;
	}
	 
	/**
	 * Executa a aplicacao. Cria Threads de programadores na quantidade especificada para cada tipo e as inicializa.
	 * @param numeroProgC numero de programadores C
	 * @param numeroProgJava numero de programadores Java
	 */
	public void executa(int numeroProgC, int numeroProgJava){
		Thread[] ThreadC = new Thread[numeroProgC]; 
		Thread[] ThreadJava = new Thread[numeroProgJava]; 
		   
		Barco barco = new Barco(numeroProgJava, numeroProgC);
		   
		for(int i=0; i < numeroProgC; i++){
		    ProgramadorC pC = new ProgramadorC(i+1, barco);
		    ThreadC[i] = new Thread(pC);
		    ThreadC[i].start();    
		}
		    
		for(int i=0; i < numeroProgJava; i++){
			ProgramadorJava pJ = new ProgramadorJava(i+1, barco);
			ThreadJava[i] = new Thread(pJ);
			ThreadJava[i].start();    
		}
	 }
}
